home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / accountant / accountant.c next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  17.5 KB  |  541 lines

  1. #include <exec/exec.h>
  2. #include <dos/dos.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "dh0:code/aelib/ae_pragmas.h"
  6. #include "dh1:source/doors/romconf/doorheader.h"
  7. extern struct Library *AEBase;
  8. char Name[200];
  9. char LastDate[200];
  10. #define NAME 1
  11. #define LASTON 2
  12. #define FIRSTON 3
  13. #define ACCOUNTDATE 4
  14. #define MONEYTHISPERIOD 5
  15. #define MONEYTOTAL 6
  16. #define BTOTAL 7
  17. #define BPTOTAL 8
  18. #define BTOTALUSED 9
  19. #define BPTOTALUSED 10
  20. #define COSTPERMEG 11
  21. #define DAYSTOTAL 12
  22. #define DAYSPTOTAL 13
  23. #define ACTIVE 14
  24. #define sr StripReturn
  25. #define g(x,y) { sprintf(temp,"%d;%dH",y,x); sm(temp,0); }
  26. #define CLEARPROMPT sm("                                                                      ",0)
  27.  
  28. struct User
  29. {
  30.   char name[31];
  31.   char comment[5][80];
  32.   long datelaston;
  33.   long datefirston;
  34.   long accountdate;
  35.   long money_this_period;
  36.   long money_total;
  37.   long mbytes_total_purchase;
  38.   long mbytes_period_purchase;
  39.   long mbytes_total_used;
  40.   long mbytes_this_period;
  41.   long costper_mbyte;
  42.   long days_remaining;
  43.   long days_total_purchased;
  44.   long days_period_purchased;
  45.   long originalbytes;
  46.   BOOL active;
  47. } U;
  48. #define CLEAR " "
  49. #define ALL 0
  50. char temp[10];
  51. void LastCommand(void);
  52. void end(void);
  53. void ChangeInfo(int opt,struct User *u);
  54. void DisplaySpec(int opt,struct User *u);
  55. void Display(struct Userr *u);
  56. void InitUser(struct User *u);
  57. void LoadUser(struct User *u);
  58. void SaveUser(struct User *u);
  59. void LoadSpec(struct User *u);
  60. void LookFor(struct User *u,int opt);
  61. int notallowed(char *s);
  62. #define USER_NAME 1
  63. #define DATES 2
  64. #define USER_PAID 3
  65. #define USER_MEG_PAID 4
  66. #define USER_MEG_USED 5
  67. #define USER_DAYS_USED 6
  68. #define USER_DAYS_PAID 7
  69. #define USER_MEG_COST 8
  70. #define USER_STATUS 9
  71. #define STATBAR 10
  72. #define CHG_NAME 1
  73. #define CHG_PAID_T 2
  74. #define CHG_PAID_H 3
  75. #define CHG_MEGPUR_T 4
  76. #define CHG_MEGPUR_H 5
  77. #define CHG_MEGUSE_T 6
  78. #define CHG_MEGUSE_H 7
  79. #define CHG_DAYPUR_T 8
  80. #define CHG_DAYPUR_H 9
  81. #define OPT_NAME 'a'
  82. #define OPT_PAID_T 'b'
  83. #define OPT_COSTMEG 'g'
  84. #define OPT_PAID_H 'h'
  85. #define OPT_MEGPUR_T 'c'
  86. #define OPT_MEGPUR_H 'i'
  87. #define OPT_MEGUSE_T 'd'
  88. #define OPT_MEGUSE_H 'j'
  89. #define OPT_DAYPUR_T 'e'
  90. #define OPT_DAYPUR_H 'k'
  91.  
  92. #define HIST sm("CHG-HIST:")
  93. #define TERM sm("CHG-TERM:")
  94.  
  95. #define Show(x) DisplaySpec(x,(struct User *)&U)
  96. #define sm sendmessage
  97. #define pm prompt
  98. #define gu getuserstring
  99. #define pu putuserstring
  100. long account=0L;
  101. char config[200];
  102. char yourname[100];
  103. BOOL ViewOnly=TRUE;
  104. main(int argc,char *argv[])
  105. {
  106.   if(argc!=2)
  107.   {
  108.     printf("ACCOUNTANT version 1.0, written by Joseph Hodge\n");
  109.     printf("This is a (XIM) for /X version 2.1+\n");
  110.     printf("\n");
  111.     printf("\n");
  112.     exit(0);
  113.   }
  114.   
  115.   Register(argv[1][0]-'0');
  116.   strcpy(config,argv[0]); StripReturn(config);
  117.   InitUser(&U);
  118.   strcpy(yourname,U.name);
  119.   LoadUser(&U);
  120.   ViewOnly=notallowed(yourname);
  121.   sm(CLEAR,0);
  122.   Display(&U);
  123.   if(!ViewOnly)
  124.   {
  125.   do
  126.   {
  127.     hotkey("",temp);
  128.     switch(temp[0])
  129.     {
  130.       case 'A': LookFor((struct User *)&U,1); Display(&U);break;
  131.       case 'l': if(!U.active){
  132.                 U.accountdate=time(NULL); U.active=TRUE;}
  133.                else {U.accountdate=0L; U.active=FALSE; } Show(USER_STATUS); Show(DATES); Show(STATBAR);break;
  134.       case 'R': 
  135.                 U.money_total += U.money_this_period; U.money_this_period=0L;
  136.                 U.mbytes_total_purchase +=U.mbytes_period_purchase; U.mbytes_period_purchase=0L;
  137.                 U.mbytes_total_used+=U.mbytes_this_period;U.mbytes_this_period=0L;
  138.                 U.days_remaining=0L;
  139.                 U.days_total_purchased+=U.days_period_purchased; U.days_period_purchased=0L;
  140.                 U.active=FALSE; U.accountdate=0L;
  141.                 Display((struct User *)&U); 
  142.       case 'L': LookFor((struct User *)&U,0); 
  143.                 Display(&U); break;
  144.       case 'N': account +=1L; LoadSpec((struct User *)&U); Display(&U);break;
  145.       case 'P': account -=1L; LoadSpec((struct User *)&U); Display(&U);break;
  146.       case 'S': SaveUser(&U); break;
  147.       case 'Q': ShutDown(); end(); break;
  148.       default: ChangeInfo(temp[0],(struct User *)&U); Display((struct User *)&U);break;
  149.     }
  150.    }while(1);
  151.    }
  152.    ShutDown(); end();
  153. }
  154. void LookFor(struct User *u,int opt)
  155. {
  156.    FILE *fi;
  157.    struct User a;
  158.    LONG accountnum=0L;
  159.    LONG slot=-1L;
  160.    char FName[200];
  161.    char name[200];
  162.    char name2[200];
  163.    char temp[100];
  164.   
  165.    g(7,20);
  166.    CLEARPROMPT; g(7,20);
  167.    if(!opt)
  168.    {
  169.    pm("LOOKFOR:Enter Name >: ",name,31);
  170.    }
  171.    else
  172.    pm("ADD ACCOUNT:Enter Name >: ",name,31); strupr(name);
  173.    if(name[0]=='\0') return;
  174.    sprintf(FName,"%s.db",config); 
  175.    fi=fopen(FName,"r+b");
  176.    if(fi==NULL) return;
  177.    while(fread((APTR)&a,sizeof(struct User),1,fi)!=NULL)
  178.    {
  179.       if(!u->active && slot==-1L)slot=accountnum;
  180.       strcpy(name2,a.name); strupr(name2);
  181.       if(!strcmp(name,name2)) { fseek(fi,(LONG)sizeof(struct User)*accountnum,0L);
  182.                                 fread((APTR)u,sizeof(struct User),1,fi);fclose(fi);
  183.                                 account=accountnum; return;
  184.                               }
  185.        accountnum +=1L;
  186.    }
  187.    fclose(fi);
  188.    g(7,20); CLEARPROMPT;
  189.    if(!opt)
  190.    {
  191.    g(7,20); sm("Account ",0); sm("",0); sm(name,0); sm(" does not exist\a",0);
  192.    }
  193.    else 
  194.    { 
  195.      g(7,20);
  196.      InitUser((struct User *)u); strcpy(u->name,name);
  197.      u->datelaston=0L; u->datefirston=0L;u->accountdate=time(NULL);
  198.      if(slot>=0L)
  199.      {
  200.        fi=fopen(FName,"r+b"); fseek(fi,(LONG)sizeof(struct User)*slot,0L);
  201.        fwrite((APTR)u,sizeof(struct User),1,fi); fclose(fi); account=slot;
  202.      } 
  203.      else
  204.      {
  205.      fi=fopen(FName,"ab");  fwrite((APTR)u,sizeof(struct User),1,fi);
  206.      fclose(fi); account =-1L;}
  207.      LoadSpec(u); 
  208.    }
  209.    
  210.    //Delay(70L);
  211. }
  212.    
  213. int notallowed(char *s)
  214. {
  215.    FILE *fi;
  216.    char FName[200];
  217.    char temp[200];
  218.    sprintf(FName,"%s.cfg",config);
  219.    fi=fopen(FName,"r");
  220.    if(fi==NULL) return(1);
  221.    strcpy(temp,s);strupr(temp);
  222.    while(fgets(FName,80,fi)!=NULL)
  223.    {
  224.      strupr(FName); StripReturn(FName);
  225.      if(!strcmp(FName,temp)) { fclose(fi); return(0); }
  226.    }
  227.    fclose(fi);
  228.    return(1);
  229. }
  230. void LoadSpec(struct User *u)
  231. {
  232.    FILE *fi;
  233.    char FName[200];
  234.    struct FileInfoBlock *FBlock;
  235.    BPTR FLock;
  236.    long Fsize;
  237.  sprintf(FName,"%s.db",config);
  238.    FLock = Lock(FName,ACCESS_READ);
  239.    FBlock=AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP);
  240.     if( Examine(FLock,FBlock) )        Fsize = FBlock->fib_Size;
  241.     UnLock(FLock);
  242.     FreeMem(FBlock,sizeof(struct FileInfoBlock));
  243.   
  244.    if(account>(Fsize/((LONG)sizeof(struct User)))-1L) account=0L;
  245.    if(account<0L) account=Fsize/((LONG)sizeof(struct User))-1L;
  246.    fi=fopen(FName,"rb");
  247.    if(fi==NULL) return;
  248.    fseek(fi,account*((LONG)sizeof(struct User)),0L);
  249.    fread((APTR)u,sizeof(struct User),1,fi);
  250.    fclose(fi);
  251.    if(u->datefirston==0L) u->datefirston=u->datelaston;
  252. }
  253. void LoadUser(struct User *u)
  254. {
  255.   FILE *fi;
  256.   char FName[200];
  257.   char temp[200];
  258.   ULONG times;
  259.   LONG openaccount=-1L;
  260.   LONG bytes;
  261.   LONG remainder;
  262.   LONG tempnum;
  263.   sprintf(FName,"%s.db",config);
  264.   fi=fopen(FName,"r+b");
  265.   if(fi==NULL) 
  266.   {  fi=fopen(FName,"ab");
  267.   fwrite((APTR)u,sizeof(struct User),1,fi);
  268.   fclose(fi);return;}
  269.   account=0L;
  270.   gu(Name,DT_TIMELASTON);
  271.   while(fread((APTR)u,sizeof(struct User),1,fi)!=NULL)
  272.   {
  273.     if(!u->active && openaccount==-1L) openaccount=account;
  274.     if(!strcmp(u->name,yourname)) 
  275.     { 
  276.        if(u->active)
  277.        {
  278.          u->datelaston=(ULONG)atol(Name);
  279.          if(u->datefirston==0L) u->datefirston=atol(Name);
  280.          if(u->mbytes_period_purchase)
  281.          {
  282.            gu(temp,DT_BYTEDOWNLOAD);
  283.            bytes=(atol(temp)-u->originalbytes)/1000L;
  284.            remainder=(u->mbytes_period_purchase-u->mbytes_this_period)-bytes;
  285.            if(remainder<0)
  286.            {
  287.              u->mbytes_this_period=u->mbytes_period_purchase;
  288.              tempnum=atol(temp)-(bytes*1000L)-(remainder*1000L);
  289.              sprintf(temp,"%ld",tempnum); pu(temp,DT_BYTEDOWNLOAD);
  290.            }
  291.            else
  292.            {
  293.              if(u->mbytes_this_period!=u->mbytes_period_purchase)
  294.              {
  295.                u->mbytes_this_period += (atol(temp)-u->originalbytes)/1000L;
  296.                tempnum=atol(temp)-(bytes*1000L);
  297.                sprintf(temp,"%ld",tempnum); pu(temp,DT_BYTEDOWNLOAD);
  298.              }
  299.            }
  300.          }
  301.          if(u->days_period_purchased)
  302.          {
  303.             times=time(NULL)-u->accountdate;
  304.             u->days_remaining=u->days_period_purchased - (times/(60L*24L));
  305.          }
  306.       }
  307.       fclose(fi); return;}
  308.     account +=1L;
  309.   }
  310.   fclose(fi);
  311.   InitUser(u); 
  312.   if(openaccount >-1L)
  313.   {
  314.     fi=fopen(FName,"r+b");
  315.     fseek(fi,(LONG)sizeof(struct User)*openaccount,0L);
  316.     fwrite((APTR)u,sizeof(struct User),1,fi);
  317.     fclose(fi);
  318.     account=openaccount;
  319.     return;
  320.   }
  321.   fi=fopen(FName,"ab");
  322.   fwrite((APTR)u,sizeof(struct User),1,fi);
  323.   fclose(fi);
  324. }
  325. void SaveUser(struct User *u)
  326. {
  327.   FILE *fi;
  328.   char FName[200];
  329.   sprintf(FName,"%s.db",config);
  330.   fi=fopen(FName,"r+b");
  331.   if(fi==NULL) return;
  332.   fseek(fi,(ULONG)(sizeof(struct User))*(ULONG)account,0);
  333.   fwrite((APTR)u,sizeof(struct User),1,fi);
  334.   fclose(fi);
  335. }
  336. void LastCommand(void)
  337. {
  338.   if(!ViewOnly){sm("",1);sm("",1); sm("",1);}else SaveUser(&U);sm("",1);
  339. }
  340. void end(void)
  341. {
  342.   exit(0);
  343. }
  344. #define DISData(opt,x,y) { sprintf(temp,"%c>%s%s   ",ViewOnly ? ' ':opt,x,y); sm(temp,0); }
  345. #define DISMoney(opt,x,y,z) { sprintf(temp,"%c>%s%s",ViewOnly ? ' ':opt,x,y); sm(temp,0); sprintf(temp,"%6ld   ",z); sm(temp,0); }
  346. #define g(x,y) { sprintf(temp,"%d;%dH",y,x); sm(temp,0); }
  347. #define gu getuserstring
  348. void Display(struct User *u)
  349. {
  350.    int i=1;
  351.    char temp[200];
  352.    char mytemp[200];
  353.  
  354.           g(1,1); sm("                            /X ACCOUNTANT v1.0                ",0);
  355.                   sm("            ",1);
  356.           g(1,2); sm("-------------------------------------------------------------------------",1);
  357.            g(5,4); DISData('a',"Name         ","                               ");   
  358.  
  359.           g(5,4); DISData('a',"Name         ",u->name); 
  360.         strcpy(mytemp,GetTheDate(u->accountdate));
  361.           g(5,5);  DISData('*',"Account Date ",u->accountdate ? mytemp:"N/A    "); 
  362.           g(5,6); 
  363.           strcpy(mytemp,GetTheDate(u->datelaston));
  364.           DISData('*',"Last  On     ", !u->datelaston ? "UNKNOWN":mytemp); 
  365.  
  366.            strcpy(mytemp,GetTheDate(u->datefirston));
  367.           DISData('*',"First On     ",!u->datefirston ? "UNKNOWN":mytemp); 
  368.  
  369.           g(5,9); 
  370.    if(!ViewOnly)
  371.    {
  372.    sm("       ACCOUNT THIS TERM                ACCOUNT HISTORY   ",1); 
  373.    }
  374.    else   sm("       ACCOUNT THIS TERM                ACCOUNT HISTORY   ",1); 
  375.  
  376.   
  377.           g(5,11);  DISMoney('b',"Amount Paid      ","$ ",u->money_this_period);
  378.                    DISMoney('h',"Amount Paid     ","$ ",u->money_total); 
  379.  
  380.           g(5,12); DISMoney('c',"Megs Purchased   ","  ",u->mbytes_period_purchase);
  381.                    DISMoney('i',"Megs Purchased  ","  ",u->mbytes_total_purchase);
  382.      
  383.           g(5,13); DISMoney('d',"Megs Used        ","  ",u->mbytes_this_period);
  384.                    DISMoney('j',"Megs Used       ","  ",u->mbytes_total_used);
  385.           g(5,14); DISMoney('e',"Days Purchased   ","  ",u->days_period_purchased);
  386.                    DISMoney('k',"Days Purchased  ","  ",u->days_total_purchased); 
  387.           g(5,15); DISMoney('f',"Days Remaining   ","  ",u->days_remaining);
  388.           g(5,17); DISMoney('g',"Cost Per Meg     ","$ ",u->costper_mbyte);
  389.                    DISData('l',"Account         ", u->active ? "ACTIVE":"INACTIVE"); 
  390.           g(1,19); sm("-------------------------------------------------------------------------",1);
  391.  if(!ViewOnly)
  392.  {
  393.          g(5,20); sm("  A)dd   S)ave   L)ookFor   N)ext",0);
  394.                   sm("   P)rior   R)ecord   Q)uit",1);
  395.  
  396.           
  397.    g(1,21); sm("-------------------------------------------------------------------------",1);
  398.    sm("",1);
  399.  }
  400.  else
  401.  {          g(1,20);    sm("   Written by ByteMaster,  /X Developement Team The Silent Achievers   ",0);
  402.  sm("",1);
  403.  }
  404.    if(!ViewOnly)
  405.    {
  406.      
  407.           g(1,22);   sm("   Written by ByteMaster,  /X Developement Team The Silent Achievers   ",0);
  408.  
  409.         //  sm("                                                                         ",0);
  410.           g(70,20);
  411.   }
  412. }
  413. void DisplaySpec(int opt,struct User *u)
  414. {
  415.    int i=1;
  416.    char temp[200];
  417.    char mytemp[200];
  418.    switch(opt)
  419.    {
  420.     case USER_NAME:
  421.            g(5,4); DISData('a',"Name         ","                               "); 
  422.  
  423.           g(5,4); DISData('a',"Name         ",u->name); 
  424.           break;
  425.     case DATES:
  426.           strcpy(mytemp,GetTheDate(u->accountdate));
  427.           g(5,5);  DISData('*',"Account Date ",u->accountdate ? mytemp:"N/A    "); 
  428.           strcpy(mytemp,GetTheDate(u->datelaston));
  429.           g(5,6);
  430.           DISData('*',"Last  On     ", !u->datelaston ? "UNKNOWN":mytemp); 
  431.  
  432.           
  433.                  strcpy(mytemp,GetTheDate(u->datefirston));
  434.           DISData('*',"First On     ",!u->datefirston ? "UNKNOWN":mytemp); 
  435.  
  436.           break;
  437.     case USER_PAID:    
  438.           g(5,11);  DISMoney('b',"Amount Paid      ","$ ",u->money_this_period);
  439.                     DISMoney('h',"Amount Paid     ","$ ",u->money_total); 
  440.           break;
  441.     case USER_MEG_PAID:
  442.           g(5,12); DISMoney('c',"Megs Purchased   ","  ",u->mbytes_period_purchase);
  443.                    DISMoney('i',"Megs Purchased  ","  ",u->mbytes_total_purchase);
  444.          break;
  445.     case USER_MEG_USED:
  446.           g(5,13); DISMoney('d',"Megs Used        ","  ",u->mbytes_this_period);
  447.                    DISMoney('j',"Megs Used       ","  ",u->mbytes_total_used);
  448.          break;
  449.     case USER_DAYS_PAID:
  450.           g(5,14); DISMoney('e',"Days Purchased   ","  ",u->days_period_purchased);
  451.                    DISMoney('k',"Days Purchased  ","  ",u->days_total_purchased); 
  452.           break;
  453.     case USER_DAYS_USED:
  454.           g(5,15); DISMoney('f',"Days Remaining   ","  ",u->days_remaining);
  455.           break;
  456.     case USER_MEG_COST:
  457.           g(5,17); DISMoney('g',"Cost Per Meg     ","$ ",u->costper_mbyte);
  458.           break;
  459.     case USER_STATUS:
  460.          g(5,17); DISMoney('g',"Cost Per Meg     ","$ ",u->costper_mbyte);
  461.                    DISData('l',"Account         ", u->active ? "ACTIVE":"INACTIVE"); 
  462.          break;
  463.     case STATBAR:
  464.           g(1,19); sm("-------------------------------------------------------------------------",1);
  465.           g(5,20); sm("  A)dd   S)ave   L)ookFor   N)ext",0);
  466.                 sm("   P)rior   R)ecord   Q)uit",1);
  467.              g(1,21); sm("-------------------------------------------------------------------------",1);
  468.           sm("",1);g(70,20);
  469.     break;
  470.   }
  471. }
  472. void ChangeInfo(int opt,struct User *u)
  473. {
  474.       char temp[200];
  475.    char mytemp[200];
  476.    
  477.    g(7,20);
  478.    CLEARPROMPT;
  479.    g(7,20);
  480.    switch(opt)
  481.    {
  482.      case OPT_NAME: 
  483.            pm("CHG:Name         >:",temp,31);
  484.            if(temp[0]!='\0') strcpy(u->name,temp);break;
  485.     case OPT_PAID_T:
  486.            pm("CHG-TERM:Amount Paid      $ >:",temp,10);
  487.            u->money_this_period=atol(temp); break;
  488.      case OPT_PAID_H:
  489.            pm("CHG-HIST:Amount Paid      $ >:",temp,10);
  490.            u->money_total=atol(temp); 
  491.           break;
  492.      case OPT_MEGPUR_T:
  493.           TERM;pm("Megs Purchased     >:",temp,10);
  494.                u->mbytes_period_purchase=atol(temp);break;
  495.      case OPT_MEGPUR_H:
  496.           HIST;pm("Megs Purchased     >:",temp,10);
  497.                u->mbytes_total_purchase=atol(temp);break;
  498.      case OPT_MEGUSE_T:
  499.           TERM;pm("Megs Used          >:",temp,10);
  500.                u->mbytes_this_period=atol(temp); break;
  501.      case OPT_MEGUSE_H:
  502.           HIST;pm("Megs Used          >:",temp,10);
  503.                u->mbytes_total_used=atol(temp);break;
  504.      case OPT_DAYPUR_T:
  505.           TERM;pm("Days Purchased     >:",temp,10);
  506.                u->days_period_purchased =atol(temp); break;
  507.      case OPT_DAYPUR_H:
  508.           HIST;pm("Days Purchased     >:",temp,10);
  509.                u->days_total_purchased=atol(temp);
  510.           break;
  511.      case OPT_COSTMEG:
  512.           pm("Cost Per Meg       >:",temp,10);
  513.                u->costper_mbyte=atol(temp); break;
  514.   }
  515.           g(1,19); sm("-------------------------------------------------------------------------",1);
  516.           g(5,20); sm("  A)dd   S)ave   L)ookFor   N)ext",0);
  517.                    sm("   P)rior   R)ecord   Q)uit",1);
  518.           g(1,21); sm("-------------------------------------------------------------------------",1);
  519.           sm("",1);g(70,20);
  520. }
  521. void InitUser(struct User *u)
  522. {
  523.   gu(Name,DT_NAME);
  524.   strcpy(u->name,Name);
  525.   gu(Name,DT_TIMELASTON);
  526.   u->datelaston=(ULONG)atol(Name);
  527.  
  528.   u->datefirston=u->datelaston;
  529.   u->accountdate=0L;
  530.   u->money_this_period=0L;
  531.   u->money_total=0L;
  532.   u->mbytes_total_purchase=0L;
  533.   u->mbytes_period_purchase=0L;
  534.   u->mbytes_total_used=0L;
  535.   u->mbytes_this_period=0L;
  536.   u->costper_mbyte=0L;
  537.   u->days_total_purchased=0L;
  538.   u->days_period_purchased=0L;
  539.   u->originalbytes=0L;
  540.   u->active=TRUE;
  541. }